<?php
/**
 * User: LRZ
 * Date: 2020/3/2
 * Time: 11:20
 */

/**
 *  125.验证回文串
 *
 *  标签：双指针、字符串
 *
 *  给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
 *  说明：本题中，我们将空字符串定义为有效的回文串。
 *
 *  示例 1:
 *      输入: "A man, a plan, a canal: Panama"
 *      输出: true
 *
 *  示例 2:
 *      输入: "race a car"
 *      输出: false
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/valid-palindrome
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$s   = '.,';
$res = isPalindrome($s);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function isPalindrome($s)
{
    $i = 0;
    $j = strlen($s) - 1;
    while ($i < $j) {
        # 当遇到不是数字或字母时，指针右移
        while ($i < $j && !ctype_alnum($s[$i])) {
            $i++;
        }
        # 当遇到不是数字或字母时，指针左移
        while ($i < $j && !ctype_alnum($s[$j])) {
            $j--;
        }
        if (strtolower($s[$i]) !== strtolower($s[$j])) {
            return false;
        }
        $i++;
        $j--;
    }
    return true;
}